package main

import (
	"fmt"
	"sort"
	"time"
)

var cache map[int]int

type areas interface {
	area() float64
}

// 三角形
type triangle struct {
	long float64 //长
	high float64 //高
}

// 正方形
type square struct {
	long float64
}

// 圆形
type rotundity struct{ radius float64 }

// 三角形面积
func (a *triangle) area() float64 { return a.high * a.long / 2 }

// 正方形面积
func (a *square) area() float64 { return a.long * a.long }

// 圆形面积
func (a *rotundity) area() float64 { return 3.14 * a.radius * a.radius }

func main() {
	square1 := square{long: 10}
	triangle1 := triangle{long: 10, high: 32}
	rotundity1 := rotundity{radius: 21}

	fmt.Printf("三角形面积= %v\n", square1.area())
	fmt.Printf("正方形面积= %v\n", triangle1.area())
	fmt.Printf("圆形面积= %v\n", rotundity1.area())

	// sort.Strings(keys)

	a := []float64{square1.area(), triangle1.area(), rotundity1.area()}

	sort.Slice(a, func(i, j int) bool { return a[i] > a[j] })

	//fmt.Println("面积倒序排列")
	for _, v := range a {
		fmt.Println(v)
	}

	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")

	cache = make(map[int]int)
	for i := 0; i < 10; i++ {
		fmt.Printf("%v \t", fib(i))
	}
	fmt.Println("")

	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")

	tz, _ := time.LoadLocation("Asia/Shanghai") //
	timelayout := "2006/1/2 15:4:5 -0700"       //格式字符串
	now := time.Now()
	st8 := fmt.Sprint(now.Year()-8, "/", int(now.Month()), "/", now.Day(), " ", 9, ":", 30, ":", 0, " +0800")
	t8, _ := time.ParseInLocation(timelayout, st8, tz)

	Millisecond := t8.UnixNano() / int64(time.Millisecond)     //8前年毫秒级时间戳
	nowMillisecond := now.UnixNano() / int64(time.Millisecond) //现在的毫秒级时间戳
	fmt.Printf("8年前的今天毫秒时间戳： %+v\n", Millisecond)
	fmt.Printf("现在的毫秒时间戳       %+v\n", nowMillisecond)
	fmt.Printf("8年前的今天格式化输出时间: %v\n", t8.Format(timelayout))
	fmt.Printf("8年前的今天是周: %v\n", int(t8.Weekday()))
	fmt.Printf("8年前的今天 至 现在已经过去了%+v周\n", (nowMillisecond-Millisecond)/1000/60/60/24/7)
	fmt.Printf("8年前的今天 至 现在已经过去了%+v天\n", (nowMillisecond-Millisecond)/1000/60/60/24)

}

func fib(n int) int {
	if v, ok := cache[n]; ok {
		return v
	}
	if n <= 1 {
		cache[n] = n
		return n
	}
	a := fib(n-1) + fib(n-2)
	cache[n] = a
	return a
}

// 阿飞老师的批改
// 存在的问题：
// 1. 求面积时，对于部分特殊值的判断没有注意，例如负值，0等；
// 2. 第三题相关的代码尽量放到一起;
// 3. 最后一题中求那天是当年的第九周，不是距离今天的第九周；
